package gops

import "fmt"

func SyncOne() {
	// 基础多协程
	template2 := `
func handleComparison() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)  // ✅ 正确：在goroutine外Add
        go func() {
            defer wg.Done()  // ✅ 使用defer确保Done执行
            // ...
        }()
    }
    wg.Wait()
}
`
	fmt.Println(template2)

	// 多个协程,包含互斥锁,防止修改同一个变量乱掉
	template1 := `package main

import (
	"encoding/json"
	"fmt"
	"sync"
)

func main() {
	var res []any
	var mu sync.Mutex
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
        wg.Add(1)
		go func(i int) {
			defer wg.Done() // 每个协程在完成时调用 wg.Done() 将等待组计数器减一

			mu.Lock() // 互斥锁, mu.Lock() 和 mu.Unlock() 确保对res的并发访问是安全的。保护对共享变量res的访问,防止并发写入导致的数据竞争。
			res = append(res, i)
			mu.Unlock()
		}(i)
	}

	wg.Wait() // 主协程调用 wg.Wait() 等待所有协程完成

	jsonStr, err := json.Marshal(res)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}
	fmt.Println(string(jsonStr))
}`

	fmt.Println(template1)

	// 三、多协程限制数量
	template3 := `
var wg sync.WaitGroup
sem := make(chan struct{}, 5) // 容量为 5 的缓冲通道

for _, task := range tasks {
    wg.Add(1)
    sem <- struct{}{} // 获取信号量
    
    go func(t Task) {
        defer func() { 
            <-sem      // 释放信号量
            wg.Done() 
        }()
        
        // 业务逻辑
        processTask(t)
    }(task)
}

wg.Wait()
close(sem)
`
	fmt.Println(template3)

}
